package ru.emms.codemeter.configuration;

import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.components.StorageScheme;
import com.intellij.util.EventDispatcher;
import com.intellij.util.xmlb.XmlSerializerUtil;

/**
 * User: crazycoder
 * Date: Nov 14, 2010
 * Time: 11:18:03 PM
 * <p/>
 * Компонент с сохраняемым состаянием, хранится в файле codemeter.xml в папке проекта.<br/>
 * При добавлении полей, нужно добавить соответствующий интерфейс редактирования для них в {@link SettingsPanel}.<br/>
 * Для того чтобы подписаться на уведомления о изменени конфигурации, необходимо зарегистрировать свою реализацию
 * {@link ConfigurationChangeListener}. Пример {@link ru.emms.codemeter.DataBaseManager}.<br/>
 */
@State(
        name = "CodemeterConfiguration",
        storages = {@Storage(id = "default", file = "$PROJECT_FILE$"),@Storage(id = "dir",
                file = "$PROJECT_CONFIG_DIR$/codemeter.xml", scheme = StorageScheme.DIRECTORY_BASED)})
public class Configuration
        implements PersistentStateComponent<Configuration> {

    // будет рассылать слушателям сообщения об изменениях конфигурации
    private EventDispatcher<ConfigurationChangeListener> dispatcher = EventDispatcher.create(ConfigurationChangeListener.class);

    private String connectionString;

    public Configuration() {
        // состояние конфигурации поумолчанию
        connectionString = "jdbc:mysql://localhost/codemeter?user=codemeter&password=aim1Ov0ephee4ooB";
    }

    public String getConnectionString() {
        return connectionString;
    }

    public void setConnectionString(String connectionString) {
        this.connectionString = connectionString;
        // рассылаем всем слушателям(по очереди) сообщение о том что строка изменилась
        dispatcher.getMulticaster().connectionStringChanged();
    }

    @Override
    public Configuration getState() {
        return this;
    }

    @Override
    public void loadState(Configuration state) {
        XmlSerializerUtil.copyBean(state, this);
    }

    public void addEventListener(ConfigurationChangeListener listener) {
        dispatcher.addListener(listener);
    }

    @SuppressWarnings("unused")
    public void removeEventListener(ConfigurationChangeListener listener) {
        dispatcher.removeListener(listener);
    }
}
